package clientClasses;

import commonClasses.commonInterfaces.ProtocolIntf;
import commonClasses.Messages.FileEOFMsg;
import commonClasses.Messages.FileMsg;
import commonClasses.MagicNumbers;
import commonClasses.Messages.Msg;
import commonClasses.Messages.QueryFollowedMsg;
import commonClasses.Messages.QueryMsg;
import commonClasses.Utils;
import commonClasses.commonInterfaces.ClientModelIntf;
import commonClasses.commonInterfaces.ItemIntf;
import commonClasses.commonInterfaces.ServerIntf;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;

public class GetItemDetailsOrder {

    private ProtocolIntf _clientProtocol = null;
    private long _itemID;
    private ClientModelIntf _model;
//    private Item item;

    public GetItemDetailsOrder(ProtocolIntf cp, long itemId) {
        _clientProtocol = cp;
        _itemID = itemId;
        _model = _clientProtocol.getClientModel();
    }

    public void go() {
        Utils.write("GetItemDetailsOrder: zaczynam");
        /*
         * wysyła query msg
         * oczekuje ->
         *  querymsg
         *  albo qfollowed
         *      wtedy na file bla bla...
         */

        QueryMsg queryMsg = new QueryMsg(_clientProtocol, _itemID);
        try {
            queryMsg.send();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("nie udało się wysłać query msg");
            return;
        }
        Utils.write("GetItemDetailsOrder: czekam na odpowiedź..");
        long msgID = Msg.receiveUint(_clientProtocol);
        Utils.write("GetItemDetailsOrder: dostałem odpowiedź");
        if (msgID == MagicNumbers.QUERY_MSG_NR) {
            Utils.write("GetItemDetailsOrder: otrzymałem query msg");
            try {
                QueryMsg queryMsg2 = new QueryMsg(_clientProtocol, _itemID);
                queryMsg2.receive();


                if (queryMsg2.getItemID() != _itemID) {
                    System.out.println("itemID się nie zgadza..");
                }
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }

        } else if (msgID == MagicNumbers.QUERY_FOLLOWED_MSG_NR) {
            Utils.write("GetItemDetailsOrder: otrzymałem query followed msg");
            try {
                QueryFollowedMsg queryFollowedMsg = new QueryFollowedMsg(_clientProtocol);
                queryFollowedMsg.receive();
                Utils.write("wczytany item id:" + queryFollowedMsg.getItemID());
                if (queryFollowedMsg.getItemID() != _itemID) {
                    System.out.println("itemID się nie zgadza..");
                }
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }

            // oczekujemy filemsg
            // bądź file eof msg.
            boolean stop = false;
            long msgIDrec;
            try {
                msgIDrec = Msg.receiveMsgId(_clientProtocol.getDIS());
                Utils.clientReceived(msgIDrec);
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("nie udało się pobrać msgID");
                return;
            }

            ArrayList<String> fileList = new ArrayList<String>();

            while (!stop) {

                if (msgIDrec == MagicNumbers.FILE_MSG_NR) {
                    FileMsg fileMsg = new FileMsg(_clientProtocol);
                    try {
                        fileMsg.receive();
                        Utils.write("Qmsgserv: wczytałem file msg");
                    } catch (Exception e) {
                        e.printStackTrace();

                    }
                    byte arr[] = new byte[Msg.longToInt(fileMsg.getLength())];
                    arr = fileMsg.getArr();

                    String fileName = Msg.getCounter() + ".jpg";

                    try {
                        FileOutputStream fos =
                                new FileOutputStream(fileName);

                        BufferedOutputStream bos = new BufferedOutputStream(
                                fos);
                        //trzeba jakoś plik zapisać..
                        bos.write(arr);
                        bos.flush();

                        fileList.add(new File(fileName).getAbsolutePath());


                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                } else if (msgIDrec == MagicNumbers.FILE_EOF_MSG_NR) {
                    FileEOFMsg fileEOFMsg = new FileEOFMsg(_clientProtocol);
                    try {
                        fileEOFMsg.receive();
                        Utils.write("Qmsgserv: wczytałem file msg");
                    } catch (Exception e) {
                        e.printStackTrace();
                        break;
                    }

                    byte arr[] = new byte[Msg.longToInt(fileEOFMsg.getLength())];
                    arr = fileEOFMsg.getArr();
                    stop = true;
                    Utils.write("wczytałem tyle bajtów: " + arr.length);
                    //trzweba jakoś plik zapisać..
                    String fileName = Msg.getCounter() + ".jpg";
                    try {
                        BufferedOutputStream bos = new BufferedOutputStream(
                                new FileOutputStream(fileName));
                        //trzweba jakoś plik zapisać..
                        bos.write(arr);
                        bos.flush();

                        fileList.add(new File(fileName).getAbsolutePath());

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {

                    Utils.write("Nieoczekiwany msg!" + msgIDrec);
                    break;
                }


                try {
                    if (!stop) {
                        msgIDrec = Msg.receiveMsgId(_clientProtocol.getDIS());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("nie udało się pobrać msgID");
                    return;
                }
            }

            try {
                if (_model != null) {
                    ServerIntf server = _model.getServerByAddAndPort(_clientProtocol.getIP(),
                            _clientProtocol.getPort());
                    if (server != null) {
                        ItemIntf item = null;
                        item = server.getItemByID(_itemID);
                        if (item != null) {
                            item.addFilePaths(fileList);

                        } else {
                            Utils.write("nie ma item o danym id!");

                        }
                    } else {
                        Utils.write("nie znalazłem serwera");


                    }
                } else {
                    Utils.write("model == null!");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        } else {
            System.out.println("wczytałem inny msg niż się spodziewałem" +
                    msgID);
        }
        Utils.write("GetItemDetailsOrder: wychodze.");
    }
}
